source: CLRX/CLRadeonExtender/trunk/doc/ClrxAsmAmdCl2.md @ 3750

Last change on this file since 3750 was 3750, checked in by matszpk, 3 years ago

CLRadeonExtender: CLRXDocs: Replace 'Defines' by 'Define'.

File size: 20.2 KB
Line 
1## CLRadeonExtender Assembler AMD Catalyst OpenCL 2.0 handling
2
3The AMD Catalyst driver provides own OpenCL implementation that can generates
4own binaries of the OpenCL programs. The CLRX assembler supports both OpenCL 1.2
5and OpenCL 2.0 binary format. This chapter describes Amd OpenCL 2.0 binary format.
6The first Catalyst drivers uses this format for OpenCL 2.0 programs.
7Current AMD drivers uses this format for OpenCL 1.2 and OpenCL 2.0 programs for
8GCN 1.1 and later architectures.
9
10## Binary format
11
12An AMD Catalyst binary format for OpenCL 2.0 support significantly differs from
13prevbious binary format for OpenCL 1.2. The Kernel codes are in single text inner binary.
14Instead of AMD CAL notes and ProgInfo entries, the kernel setup is in special
15format structure. Metadatas mainly holds arguments definitions of kernels.
16
17A CLRadeonExtender supports two versions of binary formats for OpenCL 2.0: newer (since
18AMD OpenCL 1912.05) and older (before 1912.05 driver version).
19
20Special section to define global data for all kernels:
21
22* `rodata`, `.globaldata` - read-only constant (global) data
23* `.rwdata`, `.data` - read-write global data
24* `.bss`, `.bssdata` - allocatable read-write data
25
26## Relocations
27
28A CLRX assembler handles relocations to symbol at global data, global rwdata and
29global bss data in kernel code. These relocations can be applied to places that accepts
3032-bit literal immediates. Only two types of relocations is allowed:
31
32* `place`, `place&0xffffffff`, `place%0x10000000`, `place%%0x10000000` -
33low 32 bits of value
34* `place>>32`, `place/0x100000000`, `place//0x100000000` - high 32 bits of value
35
36The `place` indicates an expression that result points to some place in one of
37allowed sections.
38
39Examples:
40
41```
42s_mov_b32       s13, (gdata+152)>>32
43s_mov_b32       s12, (gdata+152)&0xffffffff
44s_mov_b32       s15, (gdata+160)>>32
45s_mov_b32       s14, (gdata+160)&0xffffffff
46```
47
48## Layout of the source code
49
50The CLRX assembler allow to use one of two ways to configure kernel setup:
51for human (`.config`) and for quick recompilation (kernel setup, stub, metadata content).
52
53## Register usage setup
54
55The CLRX assembler automatically sets number of used VGPRs and number of used SGPRs.
56This setup can be replaced by pseudo-ops '.sgprsnum' and '.vgprsnum'.
57
58## Scalar register allocation
59
60Depend on configuration options, an assembler add VCC and FLAT_SCRATCH
61(if `.useenqueue` or `.usegeneric` enabled).
62In HSA configuration mode, a special fields determines
63what extra SGPR extra has been added.
64
65## List of the specific pseudo-operations
66
67### .acl_version
68
69Syntax: .acl_version "STRING"
70
71Set ACL version string.
72
73### .arch_minor
74
75Syntax: .arch_minor ARCH_MINOR
76
77Set architecture minor number.
78
79### .arch_stepping
80
81Syntax: .arch_minor ARCH_STEPPING
82
83Set architecture stepping number.
84
85### .arg
86
87Syntax for scalar: .arg ARGNAME \[, "ARGTYPENAME"], ARGTYPE[, unused] 
88Syntax for structure: .arg ARGNAME, \[, "ARGTYPENAME"], ARGTYPE[, STRUCTSIZE[, unused]] 
89Syntax for image: .arg ARGNAME\[, "ARGTYPENAME"], ARGTYPE[, [ACCESS] [, RESID[, unused]]] 
90Syntax for sampler: .arg ARGNAME\[, "ARGTYPENAME"], ARGTYPE[, RESID[, unused]] 
91Syntax for global pointer: .arg ARGNAME\[, "ARGTYPENAME"],
92ARGTYPE\[\[, STRUCTSIZE], PTRSPACE[, [ACCESS] [, unused]]] 
93Syntax for local pointer: .arg ARGNAME\[, "ARGTYPENAME"],
94ARGTYPE\[\[, STRUCTSIZE], PTRSPACE[, [ACCESS] [, unused]]] 
95Syntax for constant pointer: .arg ARGNAME\[, "ARGTYPENAME"],
96ARGTYPE\[\[, STRUCTSIZE], PTRSPACE\[, [ACCESS] [, [CONSTSIZE] [, unused]]]
97
98Adds kernel argument definition. Must be inside any kernel configuration. First argument is
99argument name from OpenCL kernel definition. Next optional argument is argument type name
100from OpenCL kernel definition. Next arugment is argument type:
101
102* char, uchar, short, ushort, int, uint, ulong, long, float, double - simple scalar types
103* charX, ucharX, shortX, ushortX, intX, uintX, ulongX, longX, floatX, doubleX - vector types
104(X indicates number of elements: 2, 3, 4, 8 or 16)
105* structure - structure
106* image, image1d, image1d_array, image1d_buffer, image2d, image2d_array, image3d -
107image types
108* sampler - sampler
109* queue - command queue
110* clkevent - clkevent
111* type* - pointer to data
112
113Rest of the argument depends on type of the kernel argument. STRUCTSIZE determines size of
114structure. ACCESS for image determines can be one of the: `read_only`, `rdonly` or
115`write_only`, `wronly`.
116PTRSPACE determines space where pointer points to.
117It can be one of: `local`, `constant` or `global`.
118ACCESS for pointers can be: `const`, `restrict` and `volatile`.
119CONSTSIZE determines maximum size in bytes for constant buffer.
120RESID determines resource id (only for samplers and images).
121
122* for read only images range is in 0-127.
123* for other images is in 0-63.
124* for samplers is in 0-15.
125
126The last argument `unused` indicates that argument will not be used by kernel. In this
127argument can be given 'rdonly' (argument used for read-only) and 'wronly'
128(argument used for write-only).
129
130Sample usage:
131
132```
133.arg v1,"double_t",double
134.arg v2,double2
135.arg v3,double3
136.arg v23,image2d,
137.arg v30,image2d,,5
138.arg v41,ulong16  *,global
139.arg v42,ulong16  *,global, restrict
140.arg v57,structure*,82,global
141```
142
143### .bssdata
144
145Syntax: .bssdata [align=ALIGNMENT]
146
147Go to global data bss section. Optional argument sets alignment of section.
148
149### .call_convention
150
151Syntax: .call_convention CALL_CONV
152
153This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`).
154Set call convention for kernel.
155
156### .codeversion
157
158Syntax .codeversion MAJOR, MINOR
159
160This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`).
161Set AMD code version.
162
163### .compile_options
164
165Syntax: .compile_options "STRING"
166
167Set compile options for this binary.
168
169### .config
170
171Open kernel configuration. Must be inside kernel. Kernel configuration can not be
172defined if any isametadata, metadata or stub was defined.
173Following pseudo-ops can be inside kernel config:
174
175* .arg
176* .cws
177* .debugmode
178* .dims
179* .dx10clamp
180* .exceptions
181* .localsize
182* .ieeemode
183* .pgmrsrc1
184* .pgmrsrc2
185* .priority
186* .privmode
187* .sampler
188* .scratchbuffer
189* .setupargs
190* .sgprsnum
191* .tgsize
192* .uavid
193* .useargs
194* .useenqueue
195* .usegeneric
196* .usesetup
197* .vgprsnum
198
199### .control_directive
200
201Open control directive section. This section must be 128 bytes. The content of this
202section will be stored in control_directive field in kernel configuration.
203Must be defined inside kernel.
204
205### .cws, .reqd_work_group_size
206
207Syntax: .cws SIZEHINT[, SIZEHINT[, SIZEHINT]]
208Syntax: .reqd_work_group_size SIZEHINT[, SIZEHINT[, SIZEHINT]]
209
210This pseudo-operation must be inside any kernel configuration.
211Set reqd_work_group_size hint for this kernel.
212In versions earlier than 0.1.7 this pseudo-op has been broken and this pseudo-op
213set zeroes in two last component instead ones. We recomment to fill all components.
214
215### .debug_private_segment_buffer_sgpr
216
217Syntax: .debug_private_segment_buffer_sgpr SGPRREG
218
219This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
220`debug_private_segment_buffer_sgpr` field in kernel configuration.
221
222### .debug_wavefront_private_segment_offset_sgpr
223
224Syntax: .debug_wavefront_private_segment_offset_sgpr SGPRREG
225
226This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
227`debug_wavefront_private_segment_offset_sgpr` field in kernel configuration.
228
229### .debugmode
230
231This pseudo-operation must be inside any kernel configuration.
232Enable usage of the DEBUG_MODE.
233
234### .default_hsa_features
235
236This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`).
237It sets default HSA kernel features and register features (extra SGPR registers usage).
238These default features are `.use_private_segment_buffer`, `.use_kernarg_segment_ptr`,
239`.use_ptr64` (if 64-bit binaries) and private_elem_size is 4 bytes.
240
241### .dims
242
243Syntax: .dims DIMENSIONS
244
245This pseudo-operation must be inside any kernel configuration. Define what dimensions
246(from list: x, y, z) will be used to determine space of the kernel execution.
247
248### .driver_version
249
250Syntax: .driver_version VERSION
251
252Set driver version for this binary. Version in form: MajorVersion*100+MinorVersion.
253This pseudo-op replaces driver info.
254
255### .dx10clamp
256
257This pseudo-operation must be inside any kernel configuration.
258Enable usage of the DX10_CLAMP.
259
260### .exceptions
261
262Syntax: .exceptions EXCPMASK
263
264This pseudo-operation must be inside any kernel configuration.
265Set exception mask in PGMRSRC2 register value. Value should be 7-bit.
266
267### .gds_segment_size
268
269Syntax: .gds_segment_size SIZE
270
271This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
272`gds_segment_size` field in kernel configuration.
273
274### .gdssize
275
276Syntax: .gdssize SIZE
277
278This pseudo-operation must be inside any kernel configuration. Set the GDS
279(global data share) size.
280
281### .get_driver_version
282
283Syntax: .get_driver_version SYMBOL
284
285Store current driver version to SYMBOL. Version in form `version*100 + revision`.
286
287### .globaldata
288
289Go to constant global data section.
290
291### .group_segment_align
292
293Syntax: .group_segment_align ALIGN
294
295This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
296`group_segment_align` field in kernel configuration.
297
298### .hsaconfig
299
300Open kernel HSA configuration. Must be inside kernel. Kernel configuration can not be
301defined if any isametadata, metadata or stub was defined. Do not mix with `.config`.
302
303### .ieeemode
304
305This pseudo-op must be inside any kernel configuration. Set ieee-mode.
306
307### .inner
308
309Go to inner binary place. By default assembler is in main binary.
310
311### .isametadata
312
313This pseudo-operation must be inside kernel. Go to ISA metadata content
314(only older driver binaries).
315
316### .kernarg_segment_align
317
318Syntax: .kernarg_segment_align ALIGN
319
320This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
321`kernarg_segment_alignment` field in kernel configuration. Value must be a power of two.
322
323### .kernarg_segment_size
324
325Syntax: .kernarg_segment_size SIZE
326
327This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
328`kernarg_segment_byte_size` field in kernel configuration.
329
330### .kernel_code_entry_offset
331
332Syntax: .kernel_code_entry_offset OFFSET
333
334This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
335`kernel_code_entry_byte_offset` field in kernel configuration. This field
336store offset between configuration and kernel code. By default is 256.
337
338### .kernel_code_prefetch_offset
339
340Syntax: .kernel_code_prefetch_offset OFFSET
341
342This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
343`kernel_code_prefetch_byte_offset` field in kernel configuration.
344
345### .kernel_code_prefetch_size
346
347Syntax: .kernel_code_prefetch_size OFFSET
348
349This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
350`kernel_code_prefetch_byte_size` field in kernel configuration.
351
352### .localsize
353
354Syntax: .localsize SIZE
355
356This pseudo-operation must be inside any kernel configuration. Set the initial
357local data size.
358
359### .machine
360
361Syntax: .machine KIND, MAJOR, MINOR, STEPPING
362
363This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
364machine version fields in kernel configuration.
365
366### .max_scratch_backing_memory
367
368Syntax: .max_scratch_backing_memory SIZE
369
370This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
371`max_scratch_backing_memory_byte_size` field in kernel configuration.
372
373### .metadata
374
375This pseudo-operation must be inside kernel. Go to metadata content.
376
377### .pgmrsrc1
378
379Syntax: .pgmrsrc1 VALUE
380
381This pseudo-operation must be inside kernel.
382Define value of the PGMRSRC1.
383
384
385### .pgmrsrc2
386
387Syntax: .pgmrsrc2 VALUE
388
389This pseudo-operation must be inside any kernel configuration. Set PGMRSRC2 value.
390If dimensions is set then bits that controls dimension setup will be ignored.
391SCRATCH_EN bit will be ignored.
392
393### .priority
394
395Syntax: .priority PRIORITY
396
397This pseudo-operation must be inside kernel. Define priority (0-3).
398
399### .private_elem_size
400
401Syntax: .private_elem_size ELEMSIZE
402
403This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`).
404Set `private_element_size` field in kernel configuration.
405Must be a power of two between 2 and 16.
406
407### .private_segment_align
408
409Syntax: .private_segment ALIGN
410
411This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
412`private_segment_alignment` field in kernel configuration. Value must be a power of two.
413
414### .privmode
415
416This pseudo-operation must be inside kernel.
417Enable usage of the PRIV (privileged mode).
418
419### .reserved_sgprs
420
421Syntax: .reserved_sgprs FIRSTREG, LASTREG
422
423This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
424`reserved_sgpr_first` and `reserved_sgpr_count` fields in kernel configuration.
425`reserved_sgpr_count` filled by number of registers (LASTREG-FIRSTREG+1).
426
427### .reserved_vgprs
428
429Syntax: .reserved_vgprs FIRSTREG, LASTREG
430
431This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
432`reserved_vgpr_first` and `reserved_vgpr_count` fields in kernel configuration.
433`reserved_vgpr_count` filled by number of registers (LASTREG-FIRSTREG+1).
434
435### .runtime_loader_kernel_symbol
436
437Syntax: .runtime_loader_kernel_symbol ADDRESS
438
439This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
440`runtime_loader_kernel_symbol` field in kernel configuration.
441
442### .rwdata
443
444Go to read-write global data section.
445
446### .sampler
447
448Syntax: .sampler VALUE,...
449
450Inside main and inner binary: add sampler definitions.
451Only legal when no samplerinit section. Inside kernel configuration:
452add samplers to kernel (values are sampler ids).
453
454### .samplerinit
455
456Go to samplerinit content section. Only legal if no sampler definitions.
457
458### .samplerreloc
459
460Syntax: .samplerreloc OFFSET, SAMPLERID
461
462Add sampler relocation that points to constant global data (rodata).
463
464### .scratchbuffer
465
466Syntax: .scratchbuffer SIZE
467
468This pseudo-operation must be inside any kernel configuration.
469Set scratchbuffer size.
470
471### .setup
472
473Go to kernel setup content section.
474
475### .setupargs
476
477This pseudo-op must be inside any kernel configuration. Add first kernel setup arguments.
478This pseudo-op must be before any other arguments.
479
480### .sgprsnum
481
482Syntax: .sgprsnum REGNUM
483
484This pseudo-op must be inside any kernel configuration. Set number of scalar
485registers which can be used during kernel execution. In old-config style,
486it counts SGPR registers excluding VCC, FLAT_SCRATCH and XNACK_MASK.
487In HSA-config style, it counts SGPR registers including VCC, FLAT_SCRATCH and XNACK_MASK
488(like ROCm).
489
490### .stub
491
492Go to kernel stub content section. Only allowed for older driver version binaries.
493
494### .tgsize
495
496This pseudo-op must be inside any kernel configuration.
497Enable usage of the TG_SIZE_EN.
498
499### .use_debug_enabled
500
501This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
502`is_debug_enabled` field in kernel configuration.
503
504### .use_dispatch_id
505
506This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
507`enable_sgpr_dispatch_id` field in kernel configuration.
508
509### .use_dispatch_ptr
510
511This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
512`enable_sgpr_dispatch_ptr` field in kernel configuration.
513
514### .use_dynamic_call_stack
515
516This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
517`is_dynamic_call_stack` field in kernel configuration.
518
519### .use_flat_scratch_init
520
521This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
522`enable_sgpr_flat_scratch_init` field in kernel configuration.
523
524### .use_grid_workgroup_count
525
526Syntax: .use_grid_workgroup_count DIMENSIONS
527
528This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
529`enable_sgpr_grid_workgroup_count_X`, `enable_sgpr_grid_workgroup_count_Y`
530and `enable_sgpr_grid_workgroup_count_Z` fields in kernel configuration,
531respectively by given dimensions.
532
533### .use_kernarg_segment_ptr
534
535This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
536`enable_sgpr_kernarg_segment_ptr` field in kernel configuration.
537
538### .use_ordered_append_gds
539
540This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
541`enable_ordered_append_gds` field in kernel configuration.
542
543### .use_private_segment_buffer
544
545This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
546`enable_sgpr_private_segment_buffer` field in kernel configuration.
547
548### .use_private_segment_size
549
550This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
551`enable_sgpr_private_segment_size` field in kernel configuration.
552
553### .use_ptr64
554
555This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`).
556Enable `is_ptr64` field in kernel configuration.
557
558### .use_queue_ptr
559
560This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
561`enable_sgpr_queue_ptr` field in kernel configuration.
562
563### .use_xnack_enabled
564
565This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Enable
566`is_xnack_enabled` field in kernel configuration.
567
568### .useargs
569
570This pseudo-op must be inside any kernel (non-HSA) configuration.
571Indicate that kernel uses arguments.
572
573### .useenqueue
574
575This pseudo-op must be inside any kernel (non-HSA) configuration.
576Indicate that kernel uses enqueue mechanism.
577
578### .usegeneric
579
580This pseudo-op must be inside any kernel (non-HSA) configuration.
581Indicate that kernel uses generic pointers mechanism (FLAT instructions).
582
583### .usesetup
584
585This pseudo-op must be inside any kernel (non-HSA) configuration.
586Indicate that kernel uses setup data (global sizes, local sizes, work groups num).
587
588### .userdatanum
589
590Syntax: .userdatanum NUMBER
591
592This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set number of
593registers for USERDATA.
594
595### .vectypehint
596
597Syntax: .vectypehint OPENCLTYPE
598
599This pseudo-operation must be inside any kernel configuration.
600Set vectypehint for kernel. The argument is OpenCL type.
601
602### .vgprsnum
603
604Syntax: .vgprsnum REGNUM
605
606This pseudo-op must be inside any kernel configuration. Set number of vector
607registers which can be used during kernel execution.
608
609### .wavefront_sgpr_count
610
611Syntax: .wavefront_sgpr_count REGNUM
612
613This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
614`wavefront_sgpr_count` field in kernel configuration.
615
616### .wavefront_size
617
618Syntax: .wavefront_size POWEROFTWO
619
620This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`).
621Set `wavefront_size` field in kernel configuration. Value must be a power of two.
622
623### .work_group_size_hint
624
625Syntax: .work_group_size_hint SIZEHINT[, SIZEHINT[, SIZEHINT]]
626
627This pseudo-operation must be inside any kernel configuration.
628Set work_group_size_hint for this kernel.
629
630### .workgroup_fbarrier_count
631
632Syntax: .workgroup_fbarrier_count COUNT
633
634This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
635`workgroup_fbarrier_count` field in kernel configuration.
636
637### .workgroup_group_segment_size
638
639Syntax: .workgroup_group_segment_size SIZE
640
641This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
642`workgroup_group_segment_byte_size` in kernel configuration.
643
644### .workitem_private_segment_size
645
646Syntax: .workitem_private_segment_size SIZE
647
648This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
649`workitem_private_segment_byte_size` field in kernel configuration.
650
651### .workitem_vgpr_count
652
653Syntax: .workitem_vgpr_count REGNUM
654
655This pseudo-op must be inside kernel HSA configuration (`.hsaconfig`). Set
656`workitem_vgpr_count` field in kernel configuration.
657
658## Sample code
659
660This is sample example of the kernel setup:
661
662```
663.amdcl2
664.64bit
665.gpu Bonaire
666.driver_version 191205
667.compile_options "-I ./ -cl-std=CL2.0"
668.acl_version "AMD-COMP-LIB-v0.8 (0.0.SC_BUILD_NUMBER)"
669.kernel DCT
670    .metadata
671        .byte 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
672        ...,
673    .setup
674        .byte 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
675        .byte 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
676        ....
677    .text
678/*c0000501         */ s_load_dword    s0, s[4:5], 0x1
679....
680/*bf810000         */ s_endpgm
681```
682
683This is sample of the kernel with configuration:
684
685```
686.amdcl2
687.64bit
688.gpu Bonaire
689.driver_version 191205
690.compile_options "-I ./ -cl-std=CL2.0"
691.acl_version "AMD-COMP-LIB-v0.8 (0.0.SC_BUILD_NUMBER)"
692.kernel DCT
693    .config
694        .dims xy
695        .useargs
696        .usesetup
697        .setupargs
698        .arg output,float*
699        .arg input,float*
700        .arg dct8x8,float*
701        .arg dct8x8_trans,float*
702        .arg inter,float*,local
703        .arg width,uint
704        .arg blockWidth,uint
705        .arg inverse,uint
706        .......
707    .text
708/*c0000501         */ s_load_dword    s0, s[4:5], 0x1
709....
710/*bf810000         */ s_endpgm
711```
Note: See TracBrowser for help on using the repository browser.