1*91f16700Schasinglulu /* 2*91f16700Schasinglulu * Copyright (c) 2018-2019, ARM Limited and Contributors. All rights reserved. 3*91f16700Schasinglulu * 4*91f16700Schasinglulu * SPDX-License-Identifier: BSD-3-Clause 5*91f16700Schasinglulu */ 6*91f16700Schasinglulu 7*91f16700Schasinglulu #include <assert.h> 8*91f16700Schasinglulu 9*91f16700Schasinglulu #include <platform_def.h> 10*91f16700Schasinglulu 11*91f16700Schasinglulu #include <arch_helpers.h> 12*91f16700Schasinglulu 13*91f16700Schasinglulu #include <drivers/rpi3/mailbox/rpi3_mbox.h> 14*91f16700Schasinglulu 15*91f16700Schasinglulu #define RPI3_MBOX_BUFFER_SIZE U(256) 16*91f16700Schasinglulu static uint8_t __aligned(16) rpi3_mbox_buffer[RPI3_MBOX_BUFFER_SIZE]; 17*91f16700Schasinglulu 18*91f16700Schasinglulu /******************************************************************************* 19*91f16700Schasinglulu * Request board revision. Returns the revision and 0 on success, -1 on error. 20*91f16700Schasinglulu ******************************************************************************/ 21*91f16700Schasinglulu int rpi3_vc_hardware_get_board_revision(uint32_t *revision) 22*91f16700Schasinglulu { 23*91f16700Schasinglulu uint32_t tag_request_size = sizeof(uint32_t); 24*91f16700Schasinglulu rpi3_mbox_request_t *req = (rpi3_mbox_request_t *) rpi3_mbox_buffer; 25*91f16700Schasinglulu 26*91f16700Schasinglulu assert(revision != NULL); 27*91f16700Schasinglulu 28*91f16700Schasinglulu VERBOSE("rpi3: mbox: Sending request at %p\n", (void *)req); 29*91f16700Schasinglulu 30*91f16700Schasinglulu req->size = sizeof(rpi3_mbox_buffer); 31*91f16700Schasinglulu req->code = RPI3_MBOX_PROCESS_REQUEST; 32*91f16700Schasinglulu 33*91f16700Schasinglulu req->tags[0] = RPI3_TAG_HARDWARE_GET_BOARD_REVISION; 34*91f16700Schasinglulu req->tags[1] = tag_request_size; /* Space available for the response */ 35*91f16700Schasinglulu req->tags[2] = RPI3_TAG_REQUEST; 36*91f16700Schasinglulu req->tags[3] = 0; /* Placeholder for the response */ 37*91f16700Schasinglulu 38*91f16700Schasinglulu req->tags[4] = RPI3_TAG_END; 39*91f16700Schasinglulu 40*91f16700Schasinglulu rpi3_vc_mailbox_request_send(req, RPI3_MBOX_BUFFER_SIZE); 41*91f16700Schasinglulu 42*91f16700Schasinglulu if (req->code != RPI3_MBOX_REQUEST_SUCCESSFUL) { 43*91f16700Schasinglulu ERROR("rpi3: mbox: Code = 0x%08x\n", req->code); 44*91f16700Schasinglulu return -1; 45*91f16700Schasinglulu } 46*91f16700Schasinglulu 47*91f16700Schasinglulu if (req->tags[2] != (RPI3_TAG_IS_RESPONSE | tag_request_size)) { 48*91f16700Schasinglulu ERROR("rpi3: mbox: get board revision failed (0x%08x)\n", 49*91f16700Schasinglulu req->tags[2]); 50*91f16700Schasinglulu return -1; 51*91f16700Schasinglulu } 52*91f16700Schasinglulu 53*91f16700Schasinglulu *revision = req->tags[3]; 54*91f16700Schasinglulu 55*91f16700Schasinglulu return 0; 56*91f16700Schasinglulu } 57