// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromite/api/firmware.proto

package api

import (
	context "context"
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	chromiumos "go.chromium.org/chromiumos/infra/proto/go/chromiumos"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

// TODO(b/177907747): Drop this once the migration is complete.
// List of known location that firmware can be built from
type FwLocation int32

const (
	FwLocation_FW_LOCATION_UNKNOWN FwLocation = 0
	FwLocation_PLATFORM_EC         FwLocation = 1
	FwLocation_PLATFORM_ZEPHYR     FwLocation = 2
	FwLocation_PLATFORM_TI50       FwLocation = 3
)

var FwLocation_name = map[int32]string{
	0: "FW_LOCATION_UNKNOWN",
	1: "PLATFORM_EC",
	2: "PLATFORM_ZEPHYR",
	3: "PLATFORM_TI50",
}

var FwLocation_value = map[string]int32{
	"FW_LOCATION_UNKNOWN": 0,
	"PLATFORM_EC":         1,
	"PLATFORM_ZEPHYR":     2,
	"PLATFORM_TI50":       3,
}

func (x FwLocation) String() string {
	return proto.EnumName(FwLocation_name, int32(x))
}

func (FwLocation) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{0}
}

type FwBuildMetric_FwSection_FwRegion int32

const (
	FwBuildMetric_FwSection_FW_REGION_UNKNOWN FwBuildMetric_FwSection_FwRegion = 0
	FwBuildMetric_FwSection_EC_RO             FwBuildMetric_FwSection_FwRegion = 1
	FwBuildMetric_FwSection_EC_RW             FwBuildMetric_FwSection_FwRegion = 2
	FwBuildMetric_FwSection_EC_RO_BSS         FwBuildMetric_FwSection_FwRegion = 3
	FwBuildMetric_FwSection_EC_RW_BSS         FwBuildMetric_FwSection_FwRegion = 4
	FwBuildMetric_FwSection_EC_SHARED_MEM     FwBuildMetric_FwSection_FwRegion = 5
)

var FwBuildMetric_FwSection_FwRegion_name = map[int32]string{
	0: "FW_REGION_UNKNOWN",
	1: "EC_RO",
	2: "EC_RW",
	3: "EC_RO_BSS",
	4: "EC_RW_BSS",
	5: "EC_SHARED_MEM",
}

var FwBuildMetric_FwSection_FwRegion_value = map[string]int32{
	"FW_REGION_UNKNOWN": 0,
	"EC_RO":             1,
	"EC_RW":             2,
	"EC_RO_BSS":         3,
	"EC_RW_BSS":         4,
	"EC_SHARED_MEM":     5,
}

func (x FwBuildMetric_FwSection_FwRegion) String() string {
	return proto.EnumName(FwBuildMetric_FwSection_FwRegion_name, int32(x))
}

func (FwBuildMetric_FwSection_FwRegion) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{0, 0, 0}
}

// Metrics collected on every successful firmware build
type FwBuildMetric struct {
	// Lowercase name of the firmware target built. E.g. phaser
	TargetName string `protobuf:"bytes,1,opt,name=target_name,json=targetName,proto3" json:"target_name,omitempty"`
	// Lowercase name of the platform the firmware target belongs to. May be
	// blank. E.g. octopus
	PlatformName string `protobuf:"bytes,2,opt,name=platform_name,json=platformName,proto3" json:"platform_name,omitempty"`
	// List of firmware sections and their free and total sizes in bytes
	FwSection []*FwBuildMetric_FwSection `protobuf:"bytes,3,rep,name=fw_section,json=fwSection,proto3" json:"fw_section,omitempty"`
	// Optional information related to a specific target type
	//
	// Types that are valid to be assigned to ImageType:
	//	*FwBuildMetric_Zephyr
	ImageType            isFwBuildMetric_ImageType `protobuf_oneof:"image_type"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *FwBuildMetric) Reset()         { *m = FwBuildMetric{} }
func (m *FwBuildMetric) String() string { return proto.CompactTextString(m) }
func (*FwBuildMetric) ProtoMessage()    {}
func (*FwBuildMetric) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{0}
}

func (m *FwBuildMetric) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwBuildMetric.Unmarshal(m, b)
}
func (m *FwBuildMetric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwBuildMetric.Marshal(b, m, deterministic)
}
func (m *FwBuildMetric) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwBuildMetric.Merge(m, src)
}
func (m *FwBuildMetric) XXX_Size() int {
	return xxx_messageInfo_FwBuildMetric.Size(m)
}
func (m *FwBuildMetric) XXX_DiscardUnknown() {
	xxx_messageInfo_FwBuildMetric.DiscardUnknown(m)
}

var xxx_messageInfo_FwBuildMetric proto.InternalMessageInfo

func (m *FwBuildMetric) GetTargetName() string {
	if m != nil {
		return m.TargetName
	}
	return ""
}

func (m *FwBuildMetric) GetPlatformName() string {
	if m != nil {
		return m.PlatformName
	}
	return ""
}

func (m *FwBuildMetric) GetFwSection() []*FwBuildMetric_FwSection {
	if m != nil {
		return m.FwSection
	}
	return nil
}

type isFwBuildMetric_ImageType interface {
	isFwBuildMetric_ImageType()
}

type FwBuildMetric_Zephyr struct {
	Zephyr *FwBuildMetric_ZephyrTarget `protobuf:"bytes,4,opt,name=zephyr,proto3,oneof"`
}

func (*FwBuildMetric_Zephyr) isFwBuildMetric_ImageType() {}

func (m *FwBuildMetric) GetImageType() isFwBuildMetric_ImageType {
	if m != nil {
		return m.ImageType
	}
	return nil
}

func (m *FwBuildMetric) GetZephyr() *FwBuildMetric_ZephyrTarget {
	if x, ok := m.GetImageType().(*FwBuildMetric_Zephyr); ok {
		return x.Zephyr
	}
	return nil
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*FwBuildMetric) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*FwBuildMetric_Zephyr)(nil),
	}
}

type FwBuildMetric_FwSection struct {
	// Region as described in FMAP or linker script.
	// E.g. EC_RO, EC_RW, EC_NVRAM, RO_BSS, RW_BSS, SHARED_MEM
	Region FwBuildMetric_FwSection_FwRegion `protobuf:"varint,1,opt,name=region,proto3,enum=chromite.api.FwBuildMetric_FwSection_FwRegion" json:"region,omitempty"`
	// The number of bytes used in this section
	Used uint32 `protobuf:"varint,2,opt,name=used,proto3" json:"used,omitempty"`
	// The total number of bytes available in this section
	Total                uint32   `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FwBuildMetric_FwSection) Reset()         { *m = FwBuildMetric_FwSection{} }
func (m *FwBuildMetric_FwSection) String() string { return proto.CompactTextString(m) }
func (*FwBuildMetric_FwSection) ProtoMessage()    {}
func (*FwBuildMetric_FwSection) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{0, 0}
}

func (m *FwBuildMetric_FwSection) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwBuildMetric_FwSection.Unmarshal(m, b)
}
func (m *FwBuildMetric_FwSection) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwBuildMetric_FwSection.Marshal(b, m, deterministic)
}
func (m *FwBuildMetric_FwSection) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwBuildMetric_FwSection.Merge(m, src)
}
func (m *FwBuildMetric_FwSection) XXX_Size() int {
	return xxx_messageInfo_FwBuildMetric_FwSection.Size(m)
}
func (m *FwBuildMetric_FwSection) XXX_DiscardUnknown() {
	xxx_messageInfo_FwBuildMetric_FwSection.DiscardUnknown(m)
}

var xxx_messageInfo_FwBuildMetric_FwSection proto.InternalMessageInfo

func (m *FwBuildMetric_FwSection) GetRegion() FwBuildMetric_FwSection_FwRegion {
	if m != nil {
		return m.Region
	}
	return FwBuildMetric_FwSection_FW_REGION_UNKNOWN
}

func (m *FwBuildMetric_FwSection) GetUsed() uint32 {
	if m != nil {
		return m.Used
	}
	return 0
}

func (m *FwBuildMetric_FwSection) GetTotal() uint32 {
	if m != nil {
		return m.Total
	}
	return 0
}

// Version number components: "major.minor.tiny".
type FwBuildMetric_Version struct {
	Major                uint32   `protobuf:"varint,1,opt,name=major,proto3" json:"major,omitempty"`
	Minor                uint32   `protobuf:"varint,2,opt,name=minor,proto3" json:"minor,omitempty"`
	Tiny                 uint32   `protobuf:"varint,3,opt,name=tiny,proto3" json:"tiny,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FwBuildMetric_Version) Reset()         { *m = FwBuildMetric_Version{} }
func (m *FwBuildMetric_Version) String() string { return proto.CompactTextString(m) }
func (*FwBuildMetric_Version) ProtoMessage()    {}
func (*FwBuildMetric_Version) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{0, 1}
}

func (m *FwBuildMetric_Version) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwBuildMetric_Version.Unmarshal(m, b)
}
func (m *FwBuildMetric_Version) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwBuildMetric_Version.Marshal(b, m, deterministic)
}
func (m *FwBuildMetric_Version) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwBuildMetric_Version.Merge(m, src)
}
func (m *FwBuildMetric_Version) XXX_Size() int {
	return xxx_messageInfo_FwBuildMetric_Version.Size(m)
}
func (m *FwBuildMetric_Version) XXX_DiscardUnknown() {
	xxx_messageInfo_FwBuildMetric_Version.DiscardUnknown(m)
}

var xxx_messageInfo_FwBuildMetric_Version proto.InternalMessageInfo

func (m *FwBuildMetric_Version) GetMajor() uint32 {
	if m != nil {
		return m.Major
	}
	return 0
}

func (m *FwBuildMetric_Version) GetMinor() uint32 {
	if m != nil {
		return m.Minor
	}
	return 0
}

func (m *FwBuildMetric_Version) GetTiny() uint32 {
	if m != nil {
		return m.Tiny
	}
	return 0
}

// Zephyr-base firmware target related build metrics
type FwBuildMetric_ZephyrTarget struct {
	// The version of the Zephyr kernel used during build
	KernelVersion        *FwBuildMetric_Version `protobuf:"bytes,1,opt,name=kernel_version,json=kernelVersion,proto3" json:"kernel_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *FwBuildMetric_ZephyrTarget) Reset()         { *m = FwBuildMetric_ZephyrTarget{} }
func (m *FwBuildMetric_ZephyrTarget) String() string { return proto.CompactTextString(m) }
func (*FwBuildMetric_ZephyrTarget) ProtoMessage()    {}
func (*FwBuildMetric_ZephyrTarget) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{0, 2}
}

func (m *FwBuildMetric_ZephyrTarget) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwBuildMetric_ZephyrTarget.Unmarshal(m, b)
}
func (m *FwBuildMetric_ZephyrTarget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwBuildMetric_ZephyrTarget.Marshal(b, m, deterministic)
}
func (m *FwBuildMetric_ZephyrTarget) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwBuildMetric_ZephyrTarget.Merge(m, src)
}
func (m *FwBuildMetric_ZephyrTarget) XXX_Size() int {
	return xxx_messageInfo_FwBuildMetric_ZephyrTarget.Size(m)
}
func (m *FwBuildMetric_ZephyrTarget) XXX_DiscardUnknown() {
	xxx_messageInfo_FwBuildMetric_ZephyrTarget.DiscardUnknown(m)
}

var xxx_messageInfo_FwBuildMetric_ZephyrTarget proto.InternalMessageInfo

func (m *FwBuildMetric_ZephyrTarget) GetKernelVersion() *FwBuildMetric_Version {
	if m != nil {
		return m.KernelVersion
	}
	return nil
}

// A list of FW metrics collected on every successful firmware build
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py
type FwBuildMetricList struct {
	Value                []*FwBuildMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *FwBuildMetricList) Reset()         { *m = FwBuildMetricList{} }
func (m *FwBuildMetricList) String() string { return proto.CompactTextString(m) }
func (*FwBuildMetricList) ProtoMessage()    {}
func (*FwBuildMetricList) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{1}
}

func (m *FwBuildMetricList) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwBuildMetricList.Unmarshal(m, b)
}
func (m *FwBuildMetricList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwBuildMetricList.Marshal(b, m, deterministic)
}
func (m *FwBuildMetricList) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwBuildMetricList.Merge(m, src)
}
func (m *FwBuildMetricList) XXX_Size() int {
	return xxx_messageInfo_FwBuildMetricList.Size(m)
}
func (m *FwBuildMetricList) XXX_DiscardUnknown() {
	xxx_messageInfo_FwBuildMetricList.DiscardUnknown(m)
}

var xxx_messageInfo_FwBuildMetricList proto.InternalMessageInfo

func (m *FwBuildMetricList) GetValue() []*FwBuildMetric {
	if m != nil {
		return m.Value
	}
	return nil
}

// Metrics collect on successful firmware unit test runs
type FwTestMetric struct {
	// Name of firmware test
	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FwTestMetric) Reset()         { *m = FwTestMetric{} }
func (m *FwTestMetric) String() string { return proto.CompactTextString(m) }
func (*FwTestMetric) ProtoMessage()    {}
func (*FwTestMetric) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{2}
}

func (m *FwTestMetric) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwTestMetric.Unmarshal(m, b)
}
func (m *FwTestMetric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwTestMetric.Marshal(b, m, deterministic)
}
func (m *FwTestMetric) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwTestMetric.Merge(m, src)
}
func (m *FwTestMetric) XXX_Size() int {
	return xxx_messageInfo_FwTestMetric.Size(m)
}
func (m *FwTestMetric) XXX_DiscardUnknown() {
	xxx_messageInfo_FwTestMetric.DiscardUnknown(m)
}

var xxx_messageInfo_FwTestMetric proto.InternalMessageInfo

func (m *FwTestMetric) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

// A list of FW metrics collected on every successful firmware unit test.
// Implementation note, this is a separate message since it serves as the
// serialization base between the build_api end point and the entry point
// in the firmware_builder.py
type FwTestMetricList struct {
	Value                []*FwTestMetric `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *FwTestMetricList) Reset()         { *m = FwTestMetricList{} }
func (m *FwTestMetricList) String() string { return proto.CompactTextString(m) }
func (*FwTestMetricList) ProtoMessage()    {}
func (*FwTestMetricList) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{3}
}

func (m *FwTestMetricList) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FwTestMetricList.Unmarshal(m, b)
}
func (m *FwTestMetricList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FwTestMetricList.Marshal(b, m, deterministic)
}
func (m *FwTestMetricList) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FwTestMetricList.Merge(m, src)
}
func (m *FwTestMetricList) XXX_Size() int {
	return xxx_messageInfo_FwTestMetricList.Size(m)
}
func (m *FwTestMetricList) XXX_DiscardUnknown() {
	xxx_messageInfo_FwTestMetricList.DiscardUnknown(m)
}

var xxx_messageInfo_FwTestMetricList proto.InternalMessageInfo

func (m *FwTestMetricList) GetValue() []*FwTestMetric {
	if m != nil {
		return m.Value
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareRequest struct {
	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *BuildAllTotFirmwareRequest) Reset()         { *m = BuildAllTotFirmwareRequest{} }
func (m *BuildAllTotFirmwareRequest) String() string { return proto.CompactTextString(m) }
func (*BuildAllTotFirmwareRequest) ProtoMessage()    {}
func (*BuildAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{4}
}

func (m *BuildAllTotFirmwareRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildAllTotFirmwareRequest.Unmarshal(m, b)
}
func (m *BuildAllTotFirmwareRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildAllTotFirmwareRequest.Marshal(b, m, deterministic)
}
func (m *BuildAllTotFirmwareRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildAllTotFirmwareRequest.Merge(m, src)
}
func (m *BuildAllTotFirmwareRequest) XXX_Size() int {
	return xxx_messageInfo_BuildAllTotFirmwareRequest.Size(m)
}
func (m *BuildAllTotFirmwareRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildAllTotFirmwareRequest.DiscardUnknown(m)
}

var xxx_messageInfo_BuildAllTotFirmwareRequest proto.InternalMessageInfo

func (m *BuildAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if m != nil {
		return m.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (m *BuildAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type BuildAllTotFirmwareResponse struct {
	// Metrics collected on every successful firmware build
	Metrics              *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *BuildAllTotFirmwareResponse) Reset()         { *m = BuildAllTotFirmwareResponse{} }
func (m *BuildAllTotFirmwareResponse) String() string { return proto.CompactTextString(m) }
func (*BuildAllTotFirmwareResponse) ProtoMessage()    {}
func (*BuildAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{5}
}

func (m *BuildAllTotFirmwareResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildAllTotFirmwareResponse.Unmarshal(m, b)
}
func (m *BuildAllTotFirmwareResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildAllTotFirmwareResponse.Marshal(b, m, deterministic)
}
func (m *BuildAllTotFirmwareResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildAllTotFirmwareResponse.Merge(m, src)
}
func (m *BuildAllTotFirmwareResponse) XXX_Size() int {
	return xxx_messageInfo_BuildAllTotFirmwareResponse.Size(m)
}
func (m *BuildAllTotFirmwareResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildAllTotFirmwareResponse.DiscardUnknown(m)
}

var xxx_messageInfo_BuildAllTotFirmwareResponse proto.InternalMessageInfo

func (m *BuildAllTotFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if m != nil {
		return m.Metrics
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareRequest struct {
	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromite.api.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *TestAllTotFirmwareRequest) Reset()         { *m = TestAllTotFirmwareRequest{} }
func (m *TestAllTotFirmwareRequest) String() string { return proto.CompactTextString(m) }
func (*TestAllTotFirmwareRequest) ProtoMessage()    {}
func (*TestAllTotFirmwareRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{6}
}

func (m *TestAllTotFirmwareRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestAllTotFirmwareRequest.Unmarshal(m, b)
}
func (m *TestAllTotFirmwareRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestAllTotFirmwareRequest.Marshal(b, m, deterministic)
}
func (m *TestAllTotFirmwareRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestAllTotFirmwareRequest.Merge(m, src)
}
func (m *TestAllTotFirmwareRequest) XXX_Size() int {
	return xxx_messageInfo_TestAllTotFirmwareRequest.Size(m)
}
func (m *TestAllTotFirmwareRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_TestAllTotFirmwareRequest.DiscardUnknown(m)
}

var xxx_messageInfo_TestAllTotFirmwareRequest proto.InternalMessageInfo

func (m *TestAllTotFirmwareRequest) GetFirmwareLocation() FwLocation {
	if m != nil {
		return m.FirmwareLocation
	}
	return FwLocation_FW_LOCATION_UNKNOWN
}

func (m *TestAllTotFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

// TODO(b/177907747): Drop this once the migration is complete.
type TestAllTotFirmwareResponse struct {
	// Metrics collect on successfuly firmware unit test runs
	Metrics              *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *TestAllTotFirmwareResponse) Reset()         { *m = TestAllTotFirmwareResponse{} }
func (m *TestAllTotFirmwareResponse) String() string { return proto.CompactTextString(m) }
func (*TestAllTotFirmwareResponse) ProtoMessage()    {}
func (*TestAllTotFirmwareResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{7}
}

func (m *TestAllTotFirmwareResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestAllTotFirmwareResponse.Unmarshal(m, b)
}
func (m *TestAllTotFirmwareResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestAllTotFirmwareResponse.Marshal(b, m, deterministic)
}
func (m *TestAllTotFirmwareResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestAllTotFirmwareResponse.Merge(m, src)
}
func (m *TestAllTotFirmwareResponse) XXX_Size() int {
	return xxx_messageInfo_TestAllTotFirmwareResponse.Size(m)
}
func (m *TestAllTotFirmwareResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_TestAllTotFirmwareResponse.DiscardUnknown(m)
}

var xxx_messageInfo_TestAllTotFirmwareResponse proto.InternalMessageInfo

func (m *TestAllTotFirmwareResponse) GetMetrics() *FwTestMetricList {
	if m != nil {
		return m.Metrics
	}
	return nil
}

type BuildAllFirmwareRequest struct {
	// Location of firmware to build call into firmware_builder.py entry point.
	// The `build` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *BuildAllFirmwareRequest) Reset()         { *m = BuildAllFirmwareRequest{} }
func (m *BuildAllFirmwareRequest) String() string { return proto.CompactTextString(m) }
func (*BuildAllFirmwareRequest) ProtoMessage()    {}
func (*BuildAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{8}
}

func (m *BuildAllFirmwareRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildAllFirmwareRequest.Unmarshal(m, b)
}
func (m *BuildAllFirmwareRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildAllFirmwareRequest.Marshal(b, m, deterministic)
}
func (m *BuildAllFirmwareRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildAllFirmwareRequest.Merge(m, src)
}
func (m *BuildAllFirmwareRequest) XXX_Size() int {
	return xxx_messageInfo_BuildAllFirmwareRequest.Size(m)
}
func (m *BuildAllFirmwareRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildAllFirmwareRequest.DiscardUnknown(m)
}

var xxx_messageInfo_BuildAllFirmwareRequest proto.InternalMessageInfo

func (m *BuildAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if m != nil {
		return m.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (m *BuildAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

type BuildAllFirmwareResponse struct {
	// Metrics collected on every successful firmware build
	Metrics              *FwBuildMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *BuildAllFirmwareResponse) Reset()         { *m = BuildAllFirmwareResponse{} }
func (m *BuildAllFirmwareResponse) String() string { return proto.CompactTextString(m) }
func (*BuildAllFirmwareResponse) ProtoMessage()    {}
func (*BuildAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{9}
}

func (m *BuildAllFirmwareResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildAllFirmwareResponse.Unmarshal(m, b)
}
func (m *BuildAllFirmwareResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildAllFirmwareResponse.Marshal(b, m, deterministic)
}
func (m *BuildAllFirmwareResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildAllFirmwareResponse.Merge(m, src)
}
func (m *BuildAllFirmwareResponse) XXX_Size() int {
	return xxx_messageInfo_BuildAllFirmwareResponse.Size(m)
}
func (m *BuildAllFirmwareResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildAllFirmwareResponse.DiscardUnknown(m)
}

var xxx_messageInfo_BuildAllFirmwareResponse proto.InternalMessageInfo

func (m *BuildAllFirmwareResponse) GetMetrics() *FwBuildMetricList {
	if m != nil {
		return m.Metrics
	}
	return nil
}

type TestAllFirmwareRequest struct {
	// Location of firmware to build call into firmware_builder.py entry point.
	// The `test` subcommand will be called
	FirmwareLocation chromiumos.FwLocation `protobuf:"varint,1,opt,name=firmware_location,json=firmwareLocation,proto3,enum=chromiumos.FwLocation" json:"firmware_location,omitempty"`
	// The chroot where the operations will be executed.
	// Required.
	Chroot               *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
	XXX_unrecognized     []byte             `json:"-"`
	XXX_sizecache        int32              `json:"-"`
}

func (m *TestAllFirmwareRequest) Reset()         { *m = TestAllFirmwareRequest{} }
func (m *TestAllFirmwareRequest) String() string { return proto.CompactTextString(m) }
func (*TestAllFirmwareRequest) ProtoMessage()    {}
func (*TestAllFirmwareRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{10}
}

func (m *TestAllFirmwareRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestAllFirmwareRequest.Unmarshal(m, b)
}
func (m *TestAllFirmwareRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestAllFirmwareRequest.Marshal(b, m, deterministic)
}
func (m *TestAllFirmwareRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestAllFirmwareRequest.Merge(m, src)
}
func (m *TestAllFirmwareRequest) XXX_Size() int {
	return xxx_messageInfo_TestAllFirmwareRequest.Size(m)
}
func (m *TestAllFirmwareRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_TestAllFirmwareRequest.DiscardUnknown(m)
}

var xxx_messageInfo_TestAllFirmwareRequest proto.InternalMessageInfo

func (m *TestAllFirmwareRequest) GetFirmwareLocation() chromiumos.FwLocation {
	if m != nil {
		return m.FirmwareLocation
	}
	return chromiumos.FwLocation_FW_LOCATION_UNKNOWN
}

func (m *TestAllFirmwareRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

type TestAllFirmwareResponse struct {
	// Metrics collect on successfuly firmware unit test runs
	Metrics              *FwTestMetricList `protobuf:"bytes,1,opt,name=metrics,proto3" json:"metrics,omitempty"`
	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
	XXX_unrecognized     []byte            `json:"-"`
	XXX_sizecache        int32             `json:"-"`
}

func (m *TestAllFirmwareResponse) Reset()         { *m = TestAllFirmwareResponse{} }
func (m *TestAllFirmwareResponse) String() string { return proto.CompactTextString(m) }
func (*TestAllFirmwareResponse) ProtoMessage()    {}
func (*TestAllFirmwareResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{11}
}

func (m *TestAllFirmwareResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_TestAllFirmwareResponse.Unmarshal(m, b)
}
func (m *TestAllFirmwareResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_TestAllFirmwareResponse.Marshal(b, m, deterministic)
}
func (m *TestAllFirmwareResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_TestAllFirmwareResponse.Merge(m, src)
}
func (m *TestAllFirmwareResponse) XXX_Size() int {
	return xxx_messageInfo_TestAllFirmwareResponse.Size(m)
}
func (m *TestAllFirmwareResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_TestAllFirmwareResponse.DiscardUnknown(m)
}

var xxx_messageInfo_TestAllFirmwareResponse proto.InternalMessageInfo

func (m *TestAllFirmwareResponse) GetMetrics() *FwTestMetricList {
	if m != nil {
		return m.Metrics
	}
	return nil
}

type BundleFirmwareArtifactsRequest struct {
	// The chroot where the operations will be executed.
	// Required.
	Chroot *chromiumos.Chroot `protobuf:"bytes,2,opt,name=chroot,proto3" json:"chroot,omitempty"`
	// The output directory in which to place the bundled artifacts.
	ResultPath *chromiumos.ResultPath `protobuf:"bytes,3,opt,name=result_path,json=resultPath,proto3" json:"result_path,omitempty"`
	// The artifact types requested.  The firmware_location is found in
	// artifacts.output_artifacts[].location.
	Artifacts            *chromiumos.ArtifactsByService_Firmware `protobuf:"bytes,4,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                `json:"-"`
	XXX_unrecognized     []byte                                  `json:"-"`
	XXX_sizecache        int32                                   `json:"-"`
}

func (m *BundleFirmwareArtifactsRequest) Reset()         { *m = BundleFirmwareArtifactsRequest{} }
func (m *BundleFirmwareArtifactsRequest) String() string { return proto.CompactTextString(m) }
func (*BundleFirmwareArtifactsRequest) ProtoMessage()    {}
func (*BundleFirmwareArtifactsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{12}
}

func (m *BundleFirmwareArtifactsRequest) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BundleFirmwareArtifactsRequest.Unmarshal(m, b)
}
func (m *BundleFirmwareArtifactsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BundleFirmwareArtifactsRequest.Marshal(b, m, deterministic)
}
func (m *BundleFirmwareArtifactsRequest) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BundleFirmwareArtifactsRequest.Merge(m, src)
}
func (m *BundleFirmwareArtifactsRequest) XXX_Size() int {
	return xxx_messageInfo_BundleFirmwareArtifactsRequest.Size(m)
}
func (m *BundleFirmwareArtifactsRequest) XXX_DiscardUnknown() {
	xxx_messageInfo_BundleFirmwareArtifactsRequest.DiscardUnknown(m)
}

var xxx_messageInfo_BundleFirmwareArtifactsRequest proto.InternalMessageInfo

func (m *BundleFirmwareArtifactsRequest) GetChroot() *chromiumos.Chroot {
	if m != nil {
		return m.Chroot
	}
	return nil
}

func (m *BundleFirmwareArtifactsRequest) GetResultPath() *chromiumos.ResultPath {
	if m != nil {
		return m.ResultPath
	}
	return nil
}

func (m *BundleFirmwareArtifactsRequest) GetArtifacts() *chromiumos.ArtifactsByService_Firmware {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

type BundleFirmwareArtifactsResponse struct {
	// The artifacts that were bundled.
	Artifacts            *chromiumos.UploadedArtifactsByService_Firmware `protobuf:"bytes,1,opt,name=artifacts,proto3" json:"artifacts,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                                        `json:"-"`
	XXX_unrecognized     []byte                                          `json:"-"`
	XXX_sizecache        int32                                           `json:"-"`
}

func (m *BundleFirmwareArtifactsResponse) Reset()         { *m = BundleFirmwareArtifactsResponse{} }
func (m *BundleFirmwareArtifactsResponse) String() string { return proto.CompactTextString(m) }
func (*BundleFirmwareArtifactsResponse) ProtoMessage()    {}
func (*BundleFirmwareArtifactsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_7e3de92302c5ee13, []int{13}
}

func (m *BundleFirmwareArtifactsResponse) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BundleFirmwareArtifactsResponse.Unmarshal(m, b)
}
func (m *BundleFirmwareArtifactsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BundleFirmwareArtifactsResponse.Marshal(b, m, deterministic)
}
func (m *BundleFirmwareArtifactsResponse) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BundleFirmwareArtifactsResponse.Merge(m, src)
}
func (m *BundleFirmwareArtifactsResponse) XXX_Size() int {
	return xxx_messageInfo_BundleFirmwareArtifactsResponse.Size(m)
}
func (m *BundleFirmwareArtifactsResponse) XXX_DiscardUnknown() {
	xxx_messageInfo_BundleFirmwareArtifactsResponse.DiscardUnknown(m)
}

var xxx_messageInfo_BundleFirmwareArtifactsResponse proto.InternalMessageInfo

func (m *BundleFirmwareArtifactsResponse) GetArtifacts() *chromiumos.UploadedArtifactsByService_Firmware {
	if m != nil {
		return m.Artifacts
	}
	return nil
}

func init() {
	proto.RegisterEnum("chromite.api.FwLocation", FwLocation_name, FwLocation_value)
	proto.RegisterEnum("chromite.api.FwBuildMetric_FwSection_FwRegion", FwBuildMetric_FwSection_FwRegion_name, FwBuildMetric_FwSection_FwRegion_value)
	proto.RegisterType((*FwBuildMetric)(nil), "chromite.api.FwBuildMetric")
	proto.RegisterType((*FwBuildMetric_FwSection)(nil), "chromite.api.FwBuildMetric.FwSection")
	proto.RegisterType((*FwBuildMetric_Version)(nil), "chromite.api.FwBuildMetric.Version")
	proto.RegisterType((*FwBuildMetric_ZephyrTarget)(nil), "chromite.api.FwBuildMetric.ZephyrTarget")
	proto.RegisterType((*FwBuildMetricList)(nil), "chromite.api.FwBuildMetricList")
	proto.RegisterType((*FwTestMetric)(nil), "chromite.api.FwTestMetric")
	proto.RegisterType((*FwTestMetricList)(nil), "chromite.api.FwTestMetricList")
	proto.RegisterType((*BuildAllTotFirmwareRequest)(nil), "chromite.api.BuildAllTotFirmwareRequest")
	proto.RegisterType((*BuildAllTotFirmwareResponse)(nil), "chromite.api.BuildAllTotFirmwareResponse")
	proto.RegisterType((*TestAllTotFirmwareRequest)(nil), "chromite.api.TestAllTotFirmwareRequest")
	proto.RegisterType((*TestAllTotFirmwareResponse)(nil), "chromite.api.TestAllTotFirmwareResponse")
	proto.RegisterType((*BuildAllFirmwareRequest)(nil), "chromite.api.BuildAllFirmwareRequest")
	proto.RegisterType((*BuildAllFirmwareResponse)(nil), "chromite.api.BuildAllFirmwareResponse")
	proto.RegisterType((*TestAllFirmwareRequest)(nil), "chromite.api.TestAllFirmwareRequest")
	proto.RegisterType((*TestAllFirmwareResponse)(nil), "chromite.api.TestAllFirmwareResponse")
	proto.RegisterType((*BundleFirmwareArtifactsRequest)(nil), "chromite.api.BundleFirmwareArtifactsRequest")
	proto.RegisterType((*BundleFirmwareArtifactsResponse)(nil), "chromite.api.BundleFirmwareArtifactsResponse")
}

func init() { proto.RegisterFile("chromite/api/firmware.proto", fileDescriptor_7e3de92302c5ee13) }

var fileDescriptor_7e3de92302c5ee13 = []byte{
	// 972 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x56, 0xd1, 0x72, 0xdb, 0x44,
	0x14, 0xad, 0x62, 0x3b, 0xad, 0xaf, 0xed, 0x46, 0xd9, 0x94, 0xc6, 0x28, 0x4c, 0x93, 0x71, 0x09,
	0x35, 0x1d, 0x90, 0x8b, 0x19, 0xa0, 0x3c, 0xda, 0x8e, 0x45, 0x52, 0x62, 0x3b, 0xb3, 0x76, 0x6a,
	0xc8, 0x43, 0x35, 0x5b, 0x7b, 0x6d, 0xab, 0x48, 0x96, 0x90, 0xd6, 0xf1, 0x84, 0x3f, 0x80, 0x07,
	0xf8, 0x18, 0xfe, 0x80, 0x4f, 0xe0, 0x27, 0x78, 0xe2, 0x17, 0x18, 0x46, 0xab, 0x95, 0x2d, 0x2b,
	0xb6, 0x13, 0xa6, 0xcc, 0xc0, 0xdb, 0xee, 0xdd, 0x73, 0xf7, 0x9c, 0x73, 0x77, 0xf7, 0x4a, 0xb0,
	0xd7, 0x1b, 0xb9, 0xb6, 0x65, 0x30, 0x5a, 0x22, 0x8e, 0x51, 0x1a, 0x18, 0xae, 0x35, 0x25, 0x2e,
	0x55, 0x1d, 0xd7, 0x66, 0x36, 0xca, 0x86, 0x8b, 0x2a, 0x71, 0x0c, 0xe5, 0xbd, 0x05, 0xe8, 0xeb,
	0x89, 0x61, 0xf6, 0x75, 0xe2, 0x18, 0x01, 0x56, 0xd9, 0x0d, 0x56, 0x27, 0x96, 0xed, 0x95, 0x7a,
	0xb6, 0x65, 0xd9, 0xe3, 0x60, 0xa1, 0xf0, 0x57, 0x12, 0x72, 0xda, 0xb4, 0xea, 0xc3, 0x1b, 0x94,
	0xb9, 0x46, 0x0f, 0xed, 0x43, 0x86, 0x11, 0x77, 0x48, 0x99, 0x3e, 0x26, 0x16, 0xcd, 0x4b, 0x07,
	0x52, 0x31, 0x8d, 0x21, 0x08, 0x35, 0x89, 0x45, 0xd1, 0x63, 0xc8, 0x39, 0x26, 0x61, 0x03, 0xdb,
	0xb5, 0x02, 0xc8, 0x06, 0x87, 0x64, 0xc3, 0x20, 0x07, 0x1d, 0x01, 0x0c, 0xa6, 0xba, 0x47, 0x7b,
	0xcc, 0xb0, 0xc7, 0xf9, 0xc4, 0x41, 0xa2, 0x98, 0x29, 0x1f, 0xaa, 0x51, 0xc5, 0xea, 0x02, 0xad,
	0xaa, 0x4d, 0xdb, 0x01, 0x18, 0xa7, 0x07, 0xe1, 0x10, 0x55, 0x61, 0xf3, 0x07, 0xea, 0x8c, 0xae,
	0xdc, 0x7c, 0xf2, 0x40, 0x2a, 0x66, 0xca, 0xc5, 0x75, 0x3b, 0x5c, 0x70, 0x64, 0x87, 0x0b, 0x3d,
	0xbe, 0x83, 0x45, 0xa6, 0xf2, 0x87, 0x04, 0xe9, 0xd9, 0xe6, 0x48, 0x83, 0x4d, 0x97, 0x0e, 0x7d,
	0x4d, 0xbe, 0xb1, 0xfb, 0x65, 0xf5, 0x56, 0x9a, 0x54, 0x6d, 0x8a, 0x79, 0x16, 0x16, 0xd9, 0x08,
	0x41, 0x72, 0xe2, 0xd1, 0x3e, 0xf7, 0x9e, 0xc3, 0x7c, 0x8c, 0x1e, 0x40, 0x8a, 0xd9, 0x8c, 0x98,
	0xf9, 0x04, 0x0f, 0x06, 0x93, 0xc2, 0x08, 0xee, 0x85, 0xd9, 0xe8, 0x1d, 0xd8, 0xd6, 0xba, 0x3a,
	0xae, 0x7f, 0x75, 0xd2, 0x6a, 0xea, 0xe7, 0xcd, 0xaf, 0x9b, 0xad, 0x6e, 0x53, 0xbe, 0x83, 0xd2,
	0x90, 0xaa, 0xd7, 0x74, 0xdc, 0x92, 0xa5, 0x70, 0xd8, 0x95, 0x37, 0x50, 0x0e, 0xd2, 0x3c, 0xaa,
	0x57, 0xdb, 0x6d, 0x39, 0x11, 0x4e, 0xbb, 0x7c, 0x9a, 0x44, 0xdb, 0x90, 0xab, 0xd7, 0xf4, 0xf6,
	0x71, 0x05, 0xd7, 0x8f, 0xf4, 0x46, 0xbd, 0x21, 0xa7, 0x94, 0x13, 0xb8, 0xfb, 0x92, 0xba, 0x9e,
	0x4f, 0xf4, 0x00, 0x52, 0x16, 0x79, 0x63, 0xbb, 0xdc, 0x65, 0x0e, 0x07, 0x13, 0x1e, 0x35, 0xc6,
	0xb6, 0x2b, 0x54, 0x07, 0x13, 0xdf, 0x0a, 0x33, 0xc6, 0x57, 0x42, 0x35, 0x1f, 0x2b, 0x17, 0x90,
	0x8d, 0x96, 0x13, 0xbd, 0x80, 0xfb, 0xdf, 0x51, 0x77, 0x4c, 0x4d, 0xfd, 0x32, 0x60, 0xe0, 0x1b,
	0x67, 0xca, 0x8f, 0xd7, 0x95, 0x4f, 0x88, 0xc1, 0xb9, 0x20, 0x55, 0x4c, 0xab, 0x59, 0x00, 0xc3,
	0x22, 0x43, 0xaa, 0xb3, 0x2b, 0x87, 0x16, 0x34, 0xd8, 0x5e, 0xc8, 0x3a, 0x35, 0x3c, 0x86, 0x3e,
	0x81, 0xd4, 0x25, 0x31, 0x27, 0xfe, 0xed, 0xf3, 0x2f, 0xce, 0xde, 0x1a, 0x16, 0x1c, 0x20, 0x0b,
	0x05, 0xc8, 0x6a, 0xd3, 0x0e, 0xf5, 0x98, 0xb8, 0xc6, 0x08, 0x92, 0x91, 0xfb, 0xcb, 0xc7, 0x85,
	0x23, 0x90, 0xa3, 0x18, 0x4e, 0xf5, 0x6c, 0x91, 0x4a, 0x89, 0x53, 0xcd, 0xe1, 0x21, 0xd3, 0x2f,
	0x12, 0x28, 0x5c, 0x40, 0xc5, 0x34, 0x3b, 0x36, 0xd3, 0xc4, 0xab, 0xc4, 0xf4, 0xfb, 0x09, 0xf5,
	0x18, 0xaa, 0xc3, 0x76, 0xf8, 0x50, 0x75, 0xd3, 0xee, 0x11, 0x36, 0xbf, 0x6c, 0xf9, 0xf8, 0xe6,
	0xa7, 0x62, 0x1d, 0xcb, 0x61, 0x4a, 0x18, 0x41, 0x4f, 0x61, 0xd3, 0x07, 0xdb, 0x8c, 0x1f, 0x56,
	0xa6, 0x8c, 0xd4, 0xf9, 0x13, 0x56, 0x6b, 0x7c, 0x05, 0x0b, 0x44, 0xe1, 0x1b, 0xd8, 0x5b, 0x2a,
	0xc8, 0x73, 0xec, 0xb1, 0x47, 0xd1, 0x97, 0x70, 0xd7, 0xe2, 0x0e, 0x3c, 0x71, 0x6a, 0xfb, 0x6b,
	0xea, 0xe9, 0x17, 0x05, 0x87, 0xf8, 0xc2, 0xcf, 0x12, 0xbc, 0xeb, 0x57, 0xe0, 0x7f, 0x63, 0xf5,
	0x25, 0x28, 0xcb, 0xf4, 0x08, 0xa7, 0xcf, 0xe3, 0x4e, 0x1f, 0xad, 0x3e, 0xce, 0x45, 0xa3, 0x3f,
	0x49, 0xb0, 0x1b, 0xd6, 0x30, 0x6e, 0xb3, 0xb6, 0xda, 0xe6, 0xc3, 0xa8, 0xd4, 0x7f, 0xcd, 0xe4,
	0x39, 0xe4, 0xaf, 0x6b, 0x79, 0xfb, 0xc3, 0xfc, 0x51, 0x82, 0x87, 0xa2, 0x78, 0xff, 0xb9, 0xc5,
	0x36, 0xec, 0x5e, 0x93, 0xf2, 0xd6, 0x87, 0xf8, 0xbb, 0x04, 0x8f, 0xaa, 0x93, 0x71, 0xdf, 0xa4,
	0xe1, 0xa6, 0x15, 0x97, 0x19, 0x03, 0xd2, 0x63, 0x5e, 0x68, 0xf4, 0x1f, 0x68, 0x44, 0x5f, 0x40,
	0xc6, 0xa5, 0xde, 0xc4, 0x64, 0xba, 0x43, 0xd8, 0x88, 0xf7, 0xc7, 0xcc, 0x62, 0x39, 0x30, 0x5f,
	0x3e, 0x23, 0x6c, 0x84, 0xc1, 0x9d, 0x8d, 0x51, 0x1d, 0xd2, 0x24, 0x24, 0x16, 0x5f, 0xae, 0x27,
	0xd1, 0xb4, 0x99, 0xaa, 0xea, 0x55, 0x9b, 0xba, 0x97, 0x46, 0x8f, 0xaa, 0xb3, 0x2a, 0xcc, 0x33,
	0x5f, 0x24, 0xef, 0x49, 0xf2, 0x46, 0xc1, 0x81, 0xfd, 0x95, 0x9e, 0x44, 0xc5, 0x1a, 0x51, 0xbe,
	0xa0, 0x66, 0xa5, 0x28, 0xdf, 0xb9, 0x63, 0xda, 0xa4, 0x4f, 0xfb, 0xb7, 0xe3, 0x7d, 0xfa, 0x0a,
	0x60, 0x7e, 0xce, 0x68, 0x17, 0x76, 0xb4, 0xae, 0x7e, 0xda, 0xaa, 0x55, 0x3a, 0x8b, 0x5f, 0xad,
	0x2d, 0xc8, 0x9c, 0x9d, 0x56, 0x3a, 0x5a, 0x0b, 0x37, 0xf4, 0x7a, 0x4d, 0x96, 0xd0, 0x0e, 0x6c,
	0xcd, 0x02, 0x17, 0xf5, 0xb3, 0xe3, 0x6f, 0xb1, 0xbc, 0xe1, 0x7f, 0xa7, 0x66, 0xc1, 0xce, 0xc9,
	0x67, 0xcf, 0xe4, 0x44, 0xf9, 0xd7, 0x24, 0x6c, 0x85, 0xbc, 0x42, 0x07, 0x7a, 0x03, 0x3b, 0x4b,
	0x5a, 0x18, 0x8a, 0x7d, 0xf0, 0x57, 0xb7, 0x5d, 0xe5, 0xc3, 0x5b, 0x20, 0x45, 0xb9, 0x86, 0x80,
	0xae, 0xf7, 0x10, 0xf4, 0x64, 0x71, 0x83, 0x95, 0x5d, 0x4f, 0x29, 0xde, 0x0c, 0x14, 0x44, 0x04,
	0xe4, 0xf8, 0x3b, 0x46, 0x87, 0xcb, 0x75, 0xc6, 0x49, 0x3e, 0xb8, 0x09, 0x26, 0x28, 0x5e, 0xc1,
	0x56, 0xec, 0x1d, 0xa1, 0xf7, 0x97, 0xea, 0x8b, 0x13, 0x1c, 0xde, 0x80, 0x12, 0xfb, 0x5f, 0xfa,
	0x6d, 0x71, 0xe9, 0xed, 0x43, 0x1f, 0xc5, 0x25, 0xae, 0x7b, 0x78, 0xca, 0xc7, 0xb7, 0x44, 0x07,
	0xbc, 0x8a, 0xfc, 0xdb, 0x9f, 0x4a, 0x16, 0xee, 0x85, 0x3d, 0x46, 0x96, 0xaa, 0xcf, 0x2f, 0x3e,
	0x1f, 0xda, 0xb3, 0x5b, 0xad, 0xda, 0xee, 0xb0, 0x14, 0xf9, 0xa9, 0x35, 0xc6, 0x03, 0x97, 0x94,
	0xf8, 0x3f, 0x6d, 0x69, 0x68, 0x97, 0xa2, 0x3f, 0xc3, 0xaf, 0x37, 0x79, 0xf8, 0xd3, 0xbf, 0x03,
	0x00, 0x00, 0xff, 0xff, 0x6c, 0xe3, 0x75, 0x23, 0x4e, 0x0b, 0x00, 0x00,
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConn

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion4

// FirmwareServiceClient is the client API for FirmwareService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type FirmwareServiceClient interface {
	// TODO(b/177907747): Drop this once the migration is complete.
	// Builds all of the firmware targets on ToT at specified location
	BuildAllTotFirmware(ctx context.Context, in *BuildAllTotFirmwareRequest, opts ...grpc.CallOption) (*BuildAllTotFirmwareResponse, error)
	// TODO(b/177907747): Drop this once the migration is complete.
	// Runs all of the firmware tests on ToT at specified location
	TestAllTotFirmware(ctx context.Context, in *TestAllTotFirmwareRequest, opts ...grpc.CallOption) (*TestAllTotFirmwareResponse, error)
	// Builds all of the firmware targets at specified location
	BuildAllFirmware(ctx context.Context, in *BuildAllFirmwareRequest, opts ...grpc.CallOption) (*BuildAllFirmwareResponse, error)
	// Runs all of the firmware tests at specified location
	TestAllFirmware(ctx context.Context, in *TestAllFirmwareRequest, opts ...grpc.CallOption) (*TestAllFirmwareResponse, error)
	// Bundles any firmware images and other artifacts.
	BundleFirmwareArtifacts(ctx context.Context, in *BundleFirmwareArtifactsRequest, opts ...grpc.CallOption) (*BundleFirmwareArtifactsResponse, error)
}

type firmwareServiceClient struct {
	cc *grpc.ClientConn
}

func NewFirmwareServiceClient(cc *grpc.ClientConn) FirmwareServiceClient {
	return &firmwareServiceClient{cc}
}

func (c *firmwareServiceClient) BuildAllTotFirmware(ctx context.Context, in *BuildAllTotFirmwareRequest, opts ...grpc.CallOption) (*BuildAllTotFirmwareResponse, error) {
	out := new(BuildAllTotFirmwareResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.FirmwareService/BuildAllTotFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *firmwareServiceClient) TestAllTotFirmware(ctx context.Context, in *TestAllTotFirmwareRequest, opts ...grpc.CallOption) (*TestAllTotFirmwareResponse, error) {
	out := new(TestAllTotFirmwareResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.FirmwareService/TestAllTotFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *firmwareServiceClient) BuildAllFirmware(ctx context.Context, in *BuildAllFirmwareRequest, opts ...grpc.CallOption) (*BuildAllFirmwareResponse, error) {
	out := new(BuildAllFirmwareResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.FirmwareService/BuildAllFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *firmwareServiceClient) TestAllFirmware(ctx context.Context, in *TestAllFirmwareRequest, opts ...grpc.CallOption) (*TestAllFirmwareResponse, error) {
	out := new(TestAllFirmwareResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.FirmwareService/TestAllFirmware", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *firmwareServiceClient) BundleFirmwareArtifacts(ctx context.Context, in *BundleFirmwareArtifactsRequest, opts ...grpc.CallOption) (*BundleFirmwareArtifactsResponse, error) {
	out := new(BundleFirmwareArtifactsResponse)
	err := c.cc.Invoke(ctx, "/chromite.api.FirmwareService/BundleFirmwareArtifacts", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// FirmwareServiceServer is the server API for FirmwareService service.
type FirmwareServiceServer interface {
	// TODO(b/177907747): Drop this once the migration is complete.
	// Builds all of the firmware targets on ToT at specified location
	BuildAllTotFirmware(context.Context, *BuildAllTotFirmwareRequest) (*BuildAllTotFirmwareResponse, error)
	// TODO(b/177907747): Drop this once the migration is complete.
	// Runs all of the firmware tests on ToT at specified location
	TestAllTotFirmware(context.Context, *TestAllTotFirmwareRequest) (*TestAllTotFirmwareResponse, error)
	// Builds all of the firmware targets at specified location
	BuildAllFirmware(context.Context, *BuildAllFirmwareRequest) (*BuildAllFirmwareResponse, error)
	// Runs all of the firmware tests at specified location
	TestAllFirmware(context.Context, *TestAllFirmwareRequest) (*TestAllFirmwareResponse, error)
	// Bundles any firmware images and other artifacts.
	BundleFirmwareArtifacts(context.Context, *BundleFirmwareArtifactsRequest) (*BundleFirmwareArtifactsResponse, error)
}

// UnimplementedFirmwareServiceServer can be embedded to have forward compatible implementations.
type UnimplementedFirmwareServiceServer struct {
}

func (*UnimplementedFirmwareServiceServer) BuildAllTotFirmware(ctx context.Context, req *BuildAllTotFirmwareRequest) (*BuildAllTotFirmwareResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildAllTotFirmware not implemented")
}
func (*UnimplementedFirmwareServiceServer) TestAllTotFirmware(ctx context.Context, req *TestAllTotFirmwareRequest) (*TestAllTotFirmwareResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method TestAllTotFirmware not implemented")
}
func (*UnimplementedFirmwareServiceServer) BuildAllFirmware(ctx context.Context, req *BuildAllFirmwareRequest) (*BuildAllFirmwareResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BuildAllFirmware not implemented")
}
func (*UnimplementedFirmwareServiceServer) TestAllFirmware(ctx context.Context, req *TestAllFirmwareRequest) (*TestAllFirmwareResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method TestAllFirmware not implemented")
}
func (*UnimplementedFirmwareServiceServer) BundleFirmwareArtifacts(ctx context.Context, req *BundleFirmwareArtifactsRequest) (*BundleFirmwareArtifactsResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method BundleFirmwareArtifacts not implemented")
}

func RegisterFirmwareServiceServer(s *grpc.Server, srv FirmwareServiceServer) {
	s.RegisterService(&_FirmwareService_serviceDesc, srv)
}

func _FirmwareService_BuildAllTotFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildAllTotFirmwareRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(FirmwareServiceServer).BuildAllTotFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.FirmwareService/BuildAllTotFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(FirmwareServiceServer).BuildAllTotFirmware(ctx, req.(*BuildAllTotFirmwareRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _FirmwareService_TestAllTotFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestAllTotFirmwareRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(FirmwareServiceServer).TestAllTotFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.FirmwareService/TestAllTotFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(FirmwareServiceServer).TestAllTotFirmware(ctx, req.(*TestAllTotFirmwareRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _FirmwareService_BuildAllFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BuildAllFirmwareRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(FirmwareServiceServer).BuildAllFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.FirmwareService/BuildAllFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(FirmwareServiceServer).BuildAllFirmware(ctx, req.(*BuildAllFirmwareRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _FirmwareService_TestAllFirmware_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(TestAllFirmwareRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(FirmwareServiceServer).TestAllFirmware(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.FirmwareService/TestAllFirmware",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(FirmwareServiceServer).TestAllFirmware(ctx, req.(*TestAllFirmwareRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _FirmwareService_BundleFirmwareArtifacts_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(BundleFirmwareArtifactsRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(FirmwareServiceServer).BundleFirmwareArtifacts(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/chromite.api.FirmwareService/BundleFirmwareArtifacts",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(FirmwareServiceServer).BundleFirmwareArtifacts(ctx, req.(*BundleFirmwareArtifactsRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _FirmwareService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "chromite.api.FirmwareService",
	HandlerType: (*FirmwareServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "BuildAllTotFirmware",
			Handler:    _FirmwareService_BuildAllTotFirmware_Handler,
		},
		{
			MethodName: "TestAllTotFirmware",
			Handler:    _FirmwareService_TestAllTotFirmware_Handler,
		},
		{
			MethodName: "BuildAllFirmware",
			Handler:    _FirmwareService_BuildAllFirmware_Handler,
		},
		{
			MethodName: "TestAllFirmware",
			Handler:    _FirmwareService_TestAllFirmware_Handler,
		},
		{
			MethodName: "BundleFirmwareArtifacts",
			Handler:    _FirmwareService_BundleFirmwareArtifacts_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "chromite/api/firmware.proto",
}
