Changeset fa239ff2 in rtems
- Timestamp:
- 06/19/16 13:41:45 (7 years ago)
- Branches:
- 5, master
- Children:
- 7222a65
- Parents:
- 3e2a3c4
- git-author:
- Pavel Pisa <ppisa@…> (06/19/16 13:41:45)
- git-committer:
- Pavel Pisa <ppisa@…> (06/20/16 15:01:19)
- Location:
- c/src/lib/libbsp/arm/raspberrypi/misc
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
c/src/lib/libbsp/arm/raspberrypi/misc/vc.c
r3e2a3c4 rfa239ff2 23 23 #include <bsp/mailbox.h> 24 24 #include <bsp/vc.h> 25 #include <libcpu/arm-cp15.h> 25 26 #include "vc_defines.h" 26 27 … … 46 47 } 47 48 49 /* 50 * When cache is enabled then content of buffer exchanged 51 * with VideoCore has to be propagated through ARM11/Cortex-A7 52 * caches 53 */ 54 static inline void 55 bcm2835_mailbox_buffer_flush_and_invalidate(void *buf, size_t size) 56 { 57 uint32_t sctlr_val; 58 59 sctlr_val = arm_cp15_get_control(); 60 61 arm_cp15_drain_write_buffer(); 62 if (sctlr_val & (ARM_CP15_CTRL_C | ARM_CP15_CTRL_M)) { 63 arm_cp15_drain_write_buffer(); 64 rtems_cache_flush_multiple_data_lines(buf, size); 65 rtems_cache_invalidate_multiple_data_lines(buf, size); 66 } 67 } 68 48 69 #define BCM2835_MBOX_VAL_LENGTH_MASK(_val_len) \ 49 70 (_val_len&(~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE)) … … 56 77 bcm2835_mbox_tag_display_size get_display_size; 57 78 uint32_t end_tag; 58 }buffer __attribute__((aligned (16)));79 }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 59 80 BCM2835_MBOX_INIT_BUF(&buffer); 60 81 BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_display_size, 61 82 BCM2835_MAILBOX_TAG_GET_DISPLAY_SIZE); 83 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 62 84 if (bcm2835_mailbox_send_read_buffer(&buffer)) 63 85 return -1; … … 84 106 bcm2835_mbox_tag_get_pitch get_pitch; 85 107 uint32_t end_tag; 86 } buffer __attribute__((aligned (16)));108 } buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 87 109 BCM2835_MBOX_INIT_BUF(&buffer); 88 110 BCM2835_MBOX_INIT_TAG(&buffer.set_display_size, … … 118 140 BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_pitch, 119 141 BCM2835_MAILBOX_TAG_GET_PITCH); 142 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 120 143 if (bcm2835_mailbox_send_read_buffer(&buffer)) 121 144 return -1; … … 152 175 bcm2835_mbox_tag_get_pitch get_pitch; 153 176 uint32_t end_tag; 154 }buffer __attribute__((aligned (16)));177 }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 155 178 BCM2835_MBOX_INIT_BUF(&buffer); 156 179 BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_pitch, 157 180 BCM2835_MAILBOX_TAG_GET_PITCH); 181 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 158 182 if (bcm2835_mailbox_send_read_buffer(&buffer)) 159 183 return -1; … … 172 196 bcm2835_mbox_tag_get_cmd_line get_cmd_line; 173 197 uint32_t end_tag; 174 }buffer __attribute__((aligned (16)));198 }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 175 199 BCM2835_MBOX_INIT_BUF(&buffer); 176 200 BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_cmd_line, 177 201 BCM2835_MAILBOX_TAG_GET_CMD_LINE); 202 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 178 203 if (bcm2835_mailbox_send_read_buffer(&buffer)) 179 204 return -1; … … 197 222 bcm2835_mbox_tag_power_state set_power_state; 198 223 uint32_t end_tag; 199 }buffer __attribute__((aligned (16)));224 }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 200 225 BCM2835_MBOX_INIT_BUF(&buffer); 201 226 BCM2835_MBOX_INIT_TAG(&buffer.set_power_state, … … 203 228 buffer.set_power_state.body.req.dev_id = _entries->dev_id; 204 229 buffer.set_power_state.body.req.state = _entries->state; 230 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 205 231 if (bcm2835_mailbox_send_read_buffer(&buffer)) 206 232 return -1; … … 219 245 bcm2835_mbox_tag_get_arm_memory get_arm_memory; 220 246 uint32_t end_tag; 221 }buffer __attribute__((aligned (16)));247 }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 222 248 BCM2835_MBOX_INIT_BUF(&buffer); 223 249 BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_arm_memory, 224 250 BCM2835_MAILBOX_TAG_GET_ARM_MEMORY); 251 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 225 252 if (bcm2835_mailbox_send_read_buffer(&buffer)) 226 253 return -1; … … 239 266 bcm2835_mbox_tag_get_vc_memory get_vc_memory; 240 267 uint32_t end_tag; 241 }buffer __attribute__((aligned (16)));268 }buffer BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE; 242 269 BCM2835_MBOX_INIT_BUF(&buffer); 243 270 BCM2835_MBOX_INIT_TAG_NO_REQ(&buffer.get_vc_memory, 244 271 BCM2835_MAILBOX_TAG_GET_VC_MEMORY); 272 bcm2835_mailbox_buffer_flush_and_invalidate(&buffer, sizeof(&buffer)); 245 273 if (bcm2835_mailbox_send_read_buffer(&buffer)) 246 274 return -1; -
c/src/lib/libbsp/arm/raspberrypi/misc/vc_defines.h
r3e2a3c4 rfa239ff2 115 115 (_t_)->tag_hdr.val_len = 0; \ 116 116 } 117 118 /* 119 * Mailbox buffers has to be aligned to 16 bytes because 120 * 4 LSB bits of the BCM2835_MBOX_WRITE and BCM2835_MBOX_READ 121 * registers are used to pass channel number. 122 * 123 * But there is another requirement for buffer allocation 124 * as well when interface is called after cache is enabled. 125 * The buffer should not share cache line with another variable 126 * which can be updated during data exchange with VideoCore. 127 * If cache is filled to satisfy another variable update 128 * during VideoCore output is stored into main memory then 129 * part of received data can be lost. 130 * 131 * Cache line length is 64 bytes for RPi2 Cortex-A7 data cache 132 * so align buffers to this value. 133 */ 134 #define BCM2835_MBOX_BUF_ALIGN_ATTRIBUTE __attribute__((aligned (64))) 117 135 118 136 /* Video Core */ … … 245 263 #define BCM2835_MAILBOX_TAG_SET_TURBO 0x00038009 246 264 265 #define BCM2835_MAILBOX_TAG_GET_DOMAIN_STATE 0x00030030 266 #define BCM2835_MAILBOX_TAG_SET_DOMAIN_STATE 0x00038030 267 247 268 /* Voltage */ 248 269 #define BCM2835_MAILBOX_VOLTAGE_RESERVED_UVID 0x000000000
Note: See TracChangeset
for help on using the changeset viewer.