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